{
 "metadata": {
  "name": "Time Series Classification and Clustering"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Time Series Classification and Clustering"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "In a typical classification problem you are given a set of input features and a set of discrete output classes and you want to model the relationship between the two.  There is a myriad of classification algorithms that you could use for this problem - SVMs, Naive Bayes, k-NN, etc.  But what if the input features are not independent such as with time series data?  In this case SVMs and Naive Bayes would not be a good choice since they assume that the input features are independent.  The k-NN algorithm could still work however it relies on the notion of a similarity measure between input examples.  Now the question becomes _how do we measure the similarity between two time series_?"
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "How about Euclidean distance?"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "The Euclidean distance between two time series $Q$ and $C$ of length $n$ is defined as\n",
      "\n",
      "$$d(Q,C) = \\sqrt{\\sum^n_{i=1}[Q(i)-C(i)]^2}$$\n",
      "\n",
      "At first glance, it seems like simply calculating the Euclidean distance between two time series would give us a good idea of the similarity between them.  After all, the Euclidean distance between identical time series is zero and the Euclidean distance between very different time series is large.  However, before we settle on Euclidean distance as a similarity measure we should clearly state our desired criteria for determining the similarity between two time series "
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "With a good similarity measure, small changes in two time series should result in small changes in their similarity.  With respect to Euclidean distance this is true for changes in the y-axis, but it is not true for changes in the time axis (i.e. compression and stretching).  Consider the following example."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import pandas as pd\n",
      "import numpy as np\n",
      "import matplotlib.pylab as plt\n",
      "\n",
      "x=np.linspace(0,50,100)\n",
      "ts1=pd.Series(3.1*np.sin(x/1.5)+3.5)\n",
      "ts2=pd.Series(2.2*np.sin(x/3.5+2.4)+3.2)\n",
      "ts3=pd.Series(0.04*x+3.0)\n",
      "\n",
      "ts1.plot()\n",
      "ts2.plot()\n",
      "ts3.plot()\n",
      "\n",
      "plt.ylim(-2,10)\n",
      "plt.legend(['ts1','ts2','ts3'])\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "display_data",
       "png": "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\nAAAAAElFTkSuQmCC\n"
      }
     ],
     "prompt_number": 34
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "In the above example, it is clear that $ts1$ and $ts2$ are most similar (they are both $sin$ functions under different transformations).  $ts3$ is clearly the most different. Let's compute the Euclidean distance $d(ts1,ts2)$ and $d(ts1,ts3)$ to see if the Euclidean distance measure agrees with what our intuition tells us.  Let's first create a function that computes the Euclidean distance between two time series."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def euclid_dist(t1,t2):\n",
      "    return sqrt(sum((t1-t2)**2))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 35
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Let's now find the Euclidean distance between $ts1$ and $ts2$"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print euclid_dist(ts1,ts2)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "26.959216038\n"
       ]
      }
     ],
     "prompt_number": 36
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "and the Euclidean distance between $ts1$ and $ts3$"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print euclid_dist(ts1,ts3)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "23.1892491903\n"
       ]
      }
     ],
     "prompt_number": 37
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "This is not good because according to the Euclidean distance measure, $ts1$ is more similar to $ts3$ than to $ts2$ which contradicts our intuition.  This is the problem with using the Euclidean distance measure.  It often produced pessimistic similarity measures when it encounters distortion in the time axis.  The way to deal with this is to use dynamic time warping."
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Dynamic Time Warping"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Dynamic time warping finds the optimal non-linear alignment between two time series.  The Euclidean distances between alignments are then much less susceptable to pessimistic similarity measurements due to distortion in the time axis.  There is a price to pay for this, however, because dynamic time warping is quadratic in the length of the time series used."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Dynamic time warping works in the following way. Consider two time series $Q$ and $C$ of the same length $n$ where $$Q=q_1,q_2,...,q_n$$ and $$C=c_1,c_2,...,c_n$$ The first thing we do is construct an $n\\times n$ matrix whose $i,j^{th}$ element is the Euclidean distance between $q_i$ and $c_j$.  We want to find a path through this matrix that minimizes the cumulative distance.  This path then determines the optimal alignment between the two time series.  It should be noted that it is possible for one point in a time series to be mapped to multiple points in the other time series."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Let's call the path $W$ where $$W=w_1,w_2,...,w_K$$ where each element of $W$ represents the distance between a point $i$ in $Q$ and a point $j$ in $C$ i.e. $w_k=(q_i-c_j)^2$"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "So we want to find the path with the minimum Euclidean distance $$W^*=argmin_W(\\sqrt{\\sum_{k=1}^Kw_k})$$ The optimal path is found via dynamic programming, specifically the following recursive function. $$\\gamma(i,j)=d(q_i,c_j)+min ( \\gamma(i-1,j-1),\\gamma(i-1,j),\\gamma(i,j-1))$$ "
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def DTWDistance(s1, s2):\n",
      "    DTW={}\n",
      "    \n",
      "    for i in range(len(s1)):\n",
      "        DTW[(i, -1)] = float('inf')\n",
      "    for i in range(len(s2)):\n",
      "        DTW[(-1, i)] = float('inf')\n",
      "    DTW[(-1, -1)] = 0\n",
      "\n",
      "    for i in range(len(s1)):\n",
      "        for j in range(len(s2)):\n",
      "            dist= (s1[i]-s2[j])**2\n",
      "            DTW[(i, j)] = dist + min(DTW[(i-1, j)],DTW[(i, j-1)], DTW[(i-1, j-1)])\n",
      "\t\t\n",
      "    return sqrt(DTW[len(s1)-1, len(s2)-1])"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now let's compute the Euclidean distance between $ts1$ and $ts2$ using dynamic time warping."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print DTWDistance(ts1,ts2)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "17.9297184686\n"
       ]
      }
     ],
     "prompt_number": 227
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "and now the dynamic time warping distance between $ts1$ and $ts3$"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print DTWDistance(ts1,ts3)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "21.5494948244\n"
       ]
      }
     ],
     "prompt_number": 228
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "As you can see, our results have changed from when we only used the Euclidean distance measure.  Now, in agreement with our intuition, $ts2$ is shown to be more similar to $ts1$ than $ts3$ is."
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "Speeding Up Dynamic Time Warping"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Dynamic time warping has a complexity of $O(nm)$ where $n$ is the length of the first time series and $m$ is the length of the second time series.  If you are performing dynamic time warping multiple times on long time series data, this can be prohibitively expensive.  However, there are a couple of ways to speed things up.  The first is to enforce a locality constraint.  This works under the assumption that it is unlikely for $q_i$ and $c_j$ to be matched if $i$ and $j$ are too far apart.  The threshold is determined by a window size $w$.  This way, only mappings within this window are considered which speeds up the inner loop. The following is the modified code which includes the window size $w$."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def DTWDistance(s1, s2,w):\n",
      "    DTW={}\n",
      "    \n",
      "    w = max(w, abs(len(s1)-len(s2)))\n",
      "    \n",
      "    for i in range(-1,len(s1)):\n",
      "        for j in range(-1,len(s2)):\n",
      "            DTW[(i, j)] = float('inf')\n",
      "    DTW[(-1, -1)] = 0\n",
      "  \n",
      "    for i in range(len(s1)):\n",
      "        for j in range(max(0, i-w), min(len(s2), i+w)):\n",
      "            dist= (s1[i]-s2[j])**2\n",
      "            DTW[(i, j)] = dist + min(DTW[(i-1, j)],DTW[(i, j-1)], DTW[(i-1, j-1)])\n",
      "\t\t\n",
      "    return sqrt(DTW[len(s1)-1, len(s2)-1])"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Let's test this faster version."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print DTWDistance(ts1,ts2,10)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "18.5965518384\n"
       ]
      }
     ],
     "prompt_number": 196
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print DTWDistance(ts1,ts3,10)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "22.4724828468\n"
       ]
      }
     ],
     "prompt_number": 197
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Another way to speed things up is to use the _LB Keogh_ lower bound of dynamic time warping.  It is defined as $$LBKeogh(Q,C)=\\sum_{i=1}^n (c_i-U_i)^2I(c_i > U_i)+(c_i-L_i)^2I(c_i < L_i)$$\n",
      "where $U_i$ and $L_i$ are upper and lower bounds for time series $Q$ which are defined as $U_i=max(q_{i-r}:q_{i+r})$ and $L_i=min(q_{i-r}:q_{i+r})$ for a reach $r$ and $I(\\cdot)$ is the indicator function. It can be implemented with the following function."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def LB_Keogh(s1,s2,r):\n",
      "    LB_sum=0\n",
      "    for ind,i in enumerate(s1):\n",
      "        \n",
      "        lower_bound=min(s2[(ind-r if ind-r>=0 else 0):(ind+r)])\n",
      "        upper_bound=max(s2[(ind-r if ind-r>=0 else 0):(ind+r)])\n",
      "        \n",
      "        if i>upper_bound:\n",
      "            LB_sum=LB_sum+(i-upper_bound)**2\n",
      "        elif i<lower_bound:\n",
      "            LB_sum=LB_sum+(i-lower_bound)**2\n",
      "    \n",
      "    return sqrt(LB_sum)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Let's now test on $ts1$ and $ts2$"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print LB_Keogh(ts1,ts2,20)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "6.25389235159\n"
       ]
      }
     ],
     "prompt_number": 229
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "and now $ts1$ and $ts3$."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "print LB_Keogh(ts1,ts3,20)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "19.9595478694\n"
       ]
      }
     ],
     "prompt_number": 230
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "The _LB Keogh_ lower bound method is linear whereas dynamic time warping is quadratic in complexity which make it very advantageous for searching over large sets of time series. "
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Classification and Clustering"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now that we have a reliable method to determine the similarity between two time series, we can use the k-NN algorithm for classification.  Empirically, the best results have come when $k=1$.  The following is the 1-NN algorithm that uses dynamic time warping Euclidean distance.  In this algorithm, $train$ is the training set of time series examples where the class that the time series belongs to is appended to the end of the time series.  $test$ is the test set whose corresponding classes you are trying to predict.  In this algorithm, for every time series in the test set, a search must be performed through all points in the training set so that the most similar point is found.  Given that dynamic time warping is quadratic, this can be very computationally expensive.  We can speed up classification using the _LB Keogh_ lower bound.  Computing _LB Keogh_ is much less expensive than performing dynamic time warping.  And since $LB Keogh(Q,C) \\leq DTW(Q,C)$ , we can eliminate time series that cannot possibly be more similar that the current most similar time series. In this way we are eliminating many unnecessary dynamic time warping computations."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from sklearn.metrics import classification_report\n",
      "\n",
      "def knn(train,test,w):\n",
      "    preds=[]\n",
      "    for ind,i in enumerate(test):\n",
      "        min_dist=float('inf')\n",
      "        closest_seq=[]\n",
      "        #print ind\n",
      "        for j in train:\n",
      "            if LB_Keogh(i[:-1],j[:-1],5)<min_dist:\n",
      "                dist=DTWDistance(i[:-1],j[:-1],w)\n",
      "                if dist<min_dist:\n",
      "                    min_dist=dist\n",
      "                    closest_seq=j\n",
      "        preds.append(closest_seq[-1])\n",
      "    return classification_report(test[:,-1],preds)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 2
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Now let's test it on some data. We will use a window size of 4.  Although the code is sped up with the use of the _LB Keogh_ bound and the dynamic time warping locality contraint, it may still take a few minutes to run."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "train = np.genfromtxt('datasets/train.csv', delimiter='\\t')\n",
      "test = np.genfromtxt('datasets/test.csv', delimiter='\\t')\n",
      "print knn(train,test,4)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "             precision    recall  f1-score   support\n",
        "\n",
        "          1       1.00      0.96      0.98        50\n",
        "          2       0.96      1.00      0.98        50\n",
        "          3       1.00      1.00      1.00        50\n",
        "          4       0.98      1.00      0.99        50\n",
        "          5       1.00      1.00      1.00        50\n",
        "          6       1.00      0.98      0.99        50\n",
        "\n",
        "avg / total       0.99      0.99      0.99       300\n",
        "\n"
       ]
      }
     ],
     "prompt_number": 6
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "The same idea can also be applied to k-means clustering.  In this algorithm, the number of clusters is set _apriori_ and similar time series are clustered together."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import random\n",
      "\n",
      "def k_means_clust(data,num_clust,num_iter,w=5):\n",
      "    centroids=random.sample(data,num_clust)\n",
      "    counter=0\n",
      "    for n in range(num_iter):\n",
      "        counter+=1\n",
      "        print counter\n",
      "        assignments={}\n",
      "        #assign data points to clusters\n",
      "        for ind,i in enumerate(data):\n",
      "            min_dist=float('inf')\n",
      "            closest_clust=None\n",
      "            for c_ind,j in enumerate(centroids):\n",
      "                if LB_Keogh(i,j,5)<min_dist:\n",
      "                    cur_dist=DTWDistance(i,j,w)\n",
      "                    if cur_dist<min_dist:\n",
      "                        min_dist=cur_dist\n",
      "                        closest_clust=c_ind\n",
      "            if closest_clust in assignments:\n",
      "                assignments[closest_clust].append(ind)\n",
      "            else:\n",
      "                assignments[closest_clust]=[]\n",
      "    \n",
      "        #recalculate centroids of clusters\n",
      "        for key in assignments:\n",
      "            clust_sum=0\n",
      "            for k in assignments[key]:\n",
      "                clust_sum=clust_sum+data[k]\n",
      "            centroids[key]=[m/len(assignments[key]) for m in clust_sum]\n",
      "    \n",
      "    return centroids\n",
      "        "
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 7
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Let's test it on the entire data set (i.e. the training set and the test set stacked together)."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "train = np.genfromtxt('datasets/train.csv', delimiter='\\t')\n",
      "test = np.genfromtxt('datasets/test.csv', delimiter='\\t')\n",
      "data=np.vstack((train[:,:-1],test[:,:-1]))\n",
      "\n",
      "import matplotlib.pylab as plt\n",
      "\n",
      "centroids=k_means_clust(data,4,10,4)\n",
      "for i in centroids:\n",
      "    \n",
      "    plt.plot(i)\n",
      "\n",
      "plt.show()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1\n",
        "2"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "3"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "4"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "5"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "6"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "7"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "8"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "9"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n",
        "10"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n"
       ]
      },
      {
       "output_type": "display_data",
       "png": "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\nrkJggg==\n"
      }
     ],
     "prompt_number": 8
    }
   ],
   "metadata": {}
  }
 ]
}